package com.cctc.juc.source.Athread.threadpool;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;

/**
 * [ExecutorService 线程池] 接口
 * 描述信息：该接口继承自 Executor，也就是我们常说的 [线程池]。它对外提供异步任务的接收服务，然后将接收到的异步任务转交给执行者（线程池中的工作线程）。
 * 面试题. 为什么要使用线程池？
 * 1）自己创建线程（提交并执行异步任务）的弊端：
 * - 维护（创建、销毁）成本太高（JVM 栈内存 [1M 左右]、OS 系统调用）；
 * - 无法实现有效的管理和调度，无限制的创建线程，极有可能导致系统资源过度竞争，造成阻塞甚至死锁，最终导致 OOM 甚至死机；
 * 2）使用线程池的好处：
 * - 重用线程，降低维护成本，提高响应速度；
 * - 实现对池化线程的管理和调度、提供更多的功能：控制最大并发数（避免系统资源过度竞争，造成阻塞）、定时 | 定频 | 串行化执行、监控运行状态等。
 */
public interface BExecutorService extends AExecutor {

    Future<?> submit(Runnable task);

    <T> Future<T> submit(Runnable task, T result);

    <T> Future<T> submit(Callable<T> task);

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;

    <T> List<Future<T>> invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;

    <T> List<Future<T>> invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

    /**
     * [核心] 有序关闭线程池。
     * 此方法会等待当前工作队列中的剩余任务全部执行完成之后才会执行关闭，但是此方法被调用之后线程池的状态转变为 SHUTDOWN，线程池不会再接收新的任务。
     */
    void shutdown();

    /**
     * [核心] 立即关闭线程池。
     * 此方法会打断正在执行的工作线程，并且会清空当前工作队列中的剩余任务，返回的是尚未执行的任务。
     */
    List<Runnable> shutdownNow();

    /**
     * 延迟关闭线程池。
     * 在调用 shutdown() 与 shutdownNow() 方法时，当前线程会立即返回，不会一直等待直到线程池完成关闭。如果需要等到线程池关闭完成，可以调用 awaitTermination() 方法。
     */
    boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

    /**
     * 如果线程池状态为 SHUTDOWN，则返回 true。
     */
    boolean isShutdown();

    /**
     * 如果线程池状态为 TERMINATED，则返回 true。
     */
    boolean isTerminated();

}
